package main

import (
	"fmt"
	"os"
	"sync"
)

// 单例模式

// golang 线程安全问题

// 饿汉模式: 线程安全
// 懒汉模式: 不加锁线程不安全

// 饿汉模式
var Args = os.Args

func init() {
	fmt.Println("init logic here...", Args)
}

// 饿汉模式
var args *[]string
var mu sync.Mutex

// 双重锁，解决了并发效率问题
func GetArgs() *[]string {
	if args == nil {
		mu.Lock()
		defer mu.Unlock()
		if args == nil {
			args = &os.Args
			fmt.Println("init logic here...", *args)
		}
	}
	return args
}

// fmt.Println("use cmd.GetArgs() anywhere...", GetArgs())

// once  方式实现单例模式

//Singleton 是单例模式类
type Singleton struct {
}

var singleton *Singleton
var once sync.Once

//GetInstance 用于获取单例模式对象
func GetInstance() *Singleton {
	once.Do(func() {
		singleton = &Singleton{}
	})
	return singleton
}
